#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<vector>
#include<iostream>

#define N 10

int main()
{
    //用来保存所有进程的pid,后面父进程就可以根据每个pid回收对应进程
    std::vector<pid_t> subids;
    int i=0;
    for(;i<N;i++)
    {
        pid_t pid=fork();
        if(pid==0)
        {
            //子进程
            int i=3;
            while(i--)
            {
                printf("我是一个子进程，pid:%d,ppid:%d,count:%d\n",getpid(),getppid(),i);
                sleep(1);
            }
            printf("子进程退出！\n");
            //这里退出的数字会影响到最后退出码结果！
            exit(0);
        }
        subids.push_back(pid);
    }

    //父进程
    sleep(6);
    for(auto &sid : subids)
    {
        int status=0;
        printf("父进程开始等待....\n");
        //阻塞等待每一个进程
        pid_t rid=waitpid(sid,&status,0);
        if(rid>0)
        {
            //获取进程退出码、退出信号
            int exit_code= (status>>8)&0xFF;
            int exit_signal= status & 0x7F;

            //判断退出状况
            if(exit_code==0 && exit_signal==0)
            {
                printf("子进程运行完毕，结果正确\n");
            }
            else if(exit_code>0 && exit_signal==0)
            {
                printf("子进程运行完毕，结果不正确:%d:%s\n",exit_code,strerror(exit_code));
            }
            else{
                printf("子进程出现异常\n");
            }

        }
        else{
            printf("等待失败！\n");
        }
    }
    return 0;
}
